/**
 * File:   main.cpp
 * Author: CHABOT DIEP MYCEK
 *
 */

#include <iostream>
#include <fstream>
#include <string>
#include "GrilleMotsCroises.hpp"
#include "Ihm.hpp"
#include "Joueur.hpp"
#include "main.hpp"

using namespace std;

int main(){
	Ihm ihm;
	int choix;
	do{
		ihm.ecrire<string>("Menu\n----\n\n[0]\tQuitter\n[1]\tGenerer une grille\n[2]\tEditer une grille existante\n[3]\tJouer\n\n");
		choix=ihm.demander<int>("Que voulez vous faire ?\n");
	
		switch(choix){
			case 1 : generer(); break;
			case 2 : editer(); break;
			case 3 : jouer(); break;
			default : break;
		}
	}while(choix != 0);
	return 1;
}

void generer(){
	Ihm ihm;
	int lg, haut, pourcent;
	do{
		haut = ihm.demander<int>("Quelle hauteur desirez-vous (entre 5 et 50) ?\n");
		if(haut<5 || haut>50){
			ihm.ecrire<string>("Veuillez entrer une valeur correcte (comprise entre 5 et 50)\n");
		}
	}while(haut<5 || haut>50);
	
	do{
	lg = ihm.demander<int>("Quelle longueur desirez-vous (entre 5 et 50) ?\n");
		if(lg<5 || lg>50)
			ihm.ecrire<string>("Veuillez entrer une valeur correcte (comprise entre 5 et 50)\n");
	}while(lg<5 || lg>50);
	
	do{
		pourcent = ihm.demander<int>("Quelle pourcentage de cases noires desirez-vous (entre 0 et 20) ?\n");
		if(pourcent<0 || pourcent>20)
			ihm.ecrire<string>("Veuillez entrer une valeur correcte (comprise entre 0 et 20)\n");
	}while(pourcent<0 || pourcent>20);
	
	GrilleMotsCroises *grille;
	
	bool ok;
	char r;
	
	//Creation de la grille
	grille = new GrilleMotsCroises(lg,haut,pourcent);
	grille->init();
	
	do{
		//generation
		ok = grille->generation();
		
		if(ok) r = 'N';
		else{
			r = ihm.demander<char>("Voulez-vous reessayer [o]ui/[n]on ?\n");
			if(ihm.toMaj(r)=='O'){
				//on reinitialise la grille
				grille->reinitialiser();
				
				ihm.initEcran();
				grille->afficher(true);
				
				//et on redefinit les mots
				grille->defMots(lg,haut);
			}
		}
	}while(!ok && ihm.toMaj(r)=='O');
	
	//si la grille a bien ete generee
	if(ok){
		//edition de la grille
		do{
			r = ihm.demander<char>("Voulez-vous editer les definitions de cette grille [o]ui/[n]on ?\n");
			if(r != 'o' && r != 'O' && r != 'n' && r != 'N'){
				ihm.ecrire<string>("Reponse inapropriee\n");
			}
			else if(r == 'o' || r == 'O'){
				grille->editer();
			}
		}while(r != 'o' && r != 'O' && r != 'n' && r != 'N');

		//sauvegarde (on demande si on veut sauvegarder la grille)
		int retour;
		do{
			retour=1;
			r = ihm.demander<char>("Voulez-vous sauver cette grille [o]ui/[n]on ?\n");
			if(r != 'o' && r != 'O' && r != 'n' && r != 'N'){
				ihm.ecrire<string>("Reponse inapropriee\n");
			}
			else if(r == 'o' || r == 'O'){
				retour = grille->sauver();
			}
		}while(retour == 0 || (r != 'o' && r != 'O' && r != 'n' && r != 'N'));
	}
	
	//a la fin, destruction de grille
	delete grille;
}

void editer(){
	Ihm ihm;
	GrilleMotsCroises *grille = new GrilleMotsCroises();
	int retour;
	retour =  grille->charger();
	//si le chargement c'est bien passe
	if(retour == 1){
		//edition de la grille
		grille->editer();
		
		//sauvegarde (on demande si on veut sauvegarder la grille)
		char r;
		int retour;
		do{
			retour=1;
			r = ihm.demander<char>("Voulez-vous sauver cette grille [o]ui/[n]on ?\n");
			if(r != 'o' && r != 'O' && r != 'n' && r != 'N'){
				ihm.ecrire<string>("Reponse inapropriee\n");
			}
			else if(r == 'o' || r == 'O'){
				retour = grille->sauver();
			}
		}while(retour == 0 || (r != 'o' && r != 'O' && r != 'n' && r != 'N'));
	}
	
	delete grille;
}

void jouer(){
	GrilleMotsCroises *grille = new GrilleMotsCroises();
	int retour;
	retour =  grille->charger();
	//si le chargement c'est bien passe
	if(retour == 1){
		Joueur *joueur = new Joueur(*grille);
		joueur->jouer();
		
		//destruction de joueur
		delete joueur;
	}
	//desctruction de grille
	delete grille;
}
